home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / redakcyjne / programy / Tlen 6.0.1.12 pl / tleninst60112.exe / sdk / Plugin_src / protocol-vc / demoplugin.cpp < prev    next >
C/C++ Source or Header  |  2006-09-18  |  16KB  |  499 lines

  1. // demoplugin.cpp : Defines the entry point for the DLL application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "..\..\TlenSources\plugin\plugin_struct.h"
  6. #include "..\..\TlenSources\plugin\plugin_protocol_defs.h"
  7. #include "AggressiveOptimize.h"
  8. #include "resource.h"
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11.  
  12. HINSTANCE hInst;
  13. TLENPLUGINFUNCTIONS *tlen_functions;
  14. HWND window = NULL;
  15. HANDLE tlen_hook, gg_hook;
  16.  
  17. TLENPLUGININFO pluginInfo={
  18.     sizeof(TLENPLUGININFO),
  19.     "Protocol demo",
  20.     PLUGIN_API_VERSION,
  21.     MAKE_DWORD_VERSION(1,0,0,1),
  22.     "Demonstracja funkcji protoko│≤w",
  23.     "⌐ Prawa autorskie",
  24.     "Producent",
  25.     "E@mail",
  26.     "http://www",
  27.     0,
  28.     0,
  29.     0,        
  30.     0        
  31. };
  32.  
  33. extern "C" __declspec(dllexport) TLENPLUGININFO* GetPluginInfo(DWORD TlenVersion);
  34. extern "C" __declspec(dllexport) int LoadPlugin(TLENPLUGINFUNCTIONS *tlen_functions);
  35. extern "C" __declspec(dllexport) int UnloadPlugin(void);
  36.  
  37. void AddTextToWindow(int control_ID, char *prefix, char *text, int len)
  38. {
  39.  if (text && len == 0) len = strlen(text);
  40.  HWND hw = GetDlgItem(window, control_ID);
  41.  int length = GetWindowTextLength(hw);
  42.  char *buf = (char *) malloc(length + 100 + len);
  43.  buf[length] = '\0';
  44.  GetWindowText(hw, buf, length + 100);
  45.  if (length) strcat(buf, "\r\n");
  46.  if (prefix)
  47.  {
  48.      strcat(buf, prefix);
  49.      strcat(buf, ": ");
  50.  }
  51.  if (text)
  52.  {
  53.      strcat(buf, text);
  54.  }
  55.  
  56.  SetWindowText(hw, buf);
  57.  free(buf);
  58.  SendMessage(hw, EM_SETSEL, GetWindowTextLength(hw), GetWindowTextLength(hw));
  59.  SendMessage(hw, EM_SCROLLCARET, 0, 0);
  60.  
  61. }
  62.  
  63. LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wparam, LPARAM lParam)
  64. {
  65.     switch (message) 
  66.     {
  67.         case WM_INITDIALOG:
  68.         {    
  69.             ShowWindow(hWnd, SW_SHOW);
  70.             UpdateWindow(hWnd);
  71.             return TRUE;
  72.         }
  73.         case WM_DESTROY:
  74.         {
  75.             window = NULL;
  76.             break;
  77.         }
  78.         case WM_CLOSE:
  79.         {
  80.             DestroyWindow(hWnd);
  81.             break;
  82.         }
  83.         case WM_COMMAND:
  84.         {
  85.          static int value;
  86.          switch (LOWORD(wparam))
  87.          {
  88.             case IDC_BUTTON3:
  89.             case IDC_BUTTON4:
  90.             {
  91.                 HWND hw = GetDlgItem(hWnd, IDC_EDIT6);
  92.                 int length = GetWindowTextLength(hw);
  93.                 char *buf = (char *) malloc(length + 2);
  94.                 buf[length] = '\0';
  95.                 GetWindowText(hw, buf, length + 1);
  96.  
  97.                 ProtocolRawDataDef data;
  98.                 InitializeStruct(data);
  99.  
  100.                 data.Data = buf;
  101.                 data.DataLength = length;
  102.  
  103.                 if (LOWORD(wparam) == IDC_BUTTON3)
  104.                 {
  105.                  int ret;
  106.                  CallTlenProtoFunction(hInst, PROTOCOL_ID_TLEN, PF_SENDRAWDATA, &data, NULL, ret);
  107.                 }
  108.                 else
  109.                 {
  110.                  int ret;
  111.                  CallTlenProtoFunction(hInst, PROTOCOL_ID_TLEN, PF_FEEDRAWDATA, &data, NULL, ret);
  112.                 }
  113.  
  114.                 free(buf);
  115.                 break;
  116.             }
  117.  
  118.             case IDC_BUTTON1:
  119.             {
  120.                 char user[128];
  121.                 char messg[1024];
  122.                 char tlenp[] = PROTOCOL_ID_TLEN;
  123.                 char ggp[] = PROTOCOL_ID_GG;
  124.                 char *proto;
  125.                 ProtocolMessageDef msg;
  126.                 InitializeStruct(msg);
  127.                 GetDlgItemText(hWnd, IDC_EDIT3, user, 127);
  128.                 msg.Contact.ContactID = user;
  129.                 (IsDlgButtonChecked(hWnd, IDC_RADIO1) == BST_CHECKED) ? proto = tlenp : proto = ggp;
  130.                 msg.Contact.ProtocolID = proto;
  131.                 GetDlgItemText(hWnd, IDC_EDIT4, messg, 1023);
  132.                 msg.MessageText = messg;
  133.                 msg.Flags = PROTOCOL_MESSAGE_FLAGS_CHAT;
  134.                    int ret;
  135.                 CallTlenProtoFunction(hInst, proto, PF_SENDMESSAGE, &msg, NULL, ret);            
  136.                 break;
  137.             }
  138.  
  139.             case IDC_BUTTON2:
  140.             {
  141.                 char status[128];
  142.                 char tlenp[] = PROTOCOL_ID_TLEN;
  143.                 char ggp[] = PROTOCOL_ID_GG;
  144.                 char *proto;
  145.                 ProtocolPresenceDef ps;
  146.                 InitializeStruct(ps);
  147.                 GetDlgItemText(hWnd, IDC_EDIT5, status, 127);
  148.                 ps.CurrentDescription = status;
  149.                 (IsDlgButtonChecked(hWnd, IDC_RADIO1) == BST_CHECKED) ? proto = tlenp : proto = ggp;
  150.                 if  (IsDlgButtonChecked(hWnd, IDC_RADIO4) == BST_CHECKED)
  151.                     ps.CurrentState = PROTOCOL_PRESENCE_STATE_ONLINE;
  152.                 if  (IsDlgButtonChecked(hWnd, IDC_RADIO5) == BST_CHECKED)
  153.                     ps.CurrentState = PROTOCOL_PRESENCE_STATE_OFFLINE;
  154.                 if  (IsDlgButtonChecked(hWnd, IDC_RADIO6) == BST_CHECKED)
  155.                     ps.CurrentState = PROTOCOL_PRESENCE_STATE_AWAY;
  156.                 if  (IsDlgButtonChecked(hWnd, IDC_RADIO7) == BST_CHECKED)
  157.                     ps.CurrentState = PROTOCOL_PRESENCE_STATE_INVISIBLE;
  158.                 if  (IsDlgButtonChecked(hWnd, IDC_RADIO8) == BST_CHECKED)
  159.                     ps.CurrentState = PROTOCOL_PRESENCE_STATE_XA;
  160.                 if  (IsDlgButtonChecked(hWnd, IDC_RADIO9) == BST_CHECKED)
  161.                     ps.CurrentState = PROTOCOL_PRESENCE_STATE_DND;
  162.                 if  (IsDlgButtonChecked(hWnd, IDC_RADIO10) == BST_CHECKED)
  163.                     ps.CurrentState = PROTOCOL_PRESENCE_STATE_CHAT;
  164.  
  165.                 int ret;
  166.                 CallTlenProtoFunction(hInst, proto, PF_CHANGEUSERSTATE, &ps, NULL, ret);            
  167.                 break;
  168.             }
  169.  
  170.             case IDC_BUTTON5:
  171.             {
  172.                 char tmp[128];
  173.                 ProtocolPresenceDef prs;
  174.                 int ret;
  175.                 InitializeStruct(prs);
  176.                 CallTlenProtoFunction(hInst, PROTOCOL_ID_GG, PF_GETUSERSTATE, &prs, NULL, ret);            
  177.  
  178.                 
  179.                AddTextToWindow(IDC_EDIT8, "USER STATE", NULL, 0);
  180.  
  181.                sprintf(tmp, "%d", prs.CurrentState);
  182.                AddTextToWindow(IDC_EDIT8, "CurrentState", tmp, 0);
  183.                AddTextToWindow(IDC_EDIT8, "CurrentDesc", prs.CurrentDescription, 0);
  184.   
  185.                   CallTlenProtoFunction(hInst, PROTOCOL_ID_TLEN, PF_GETUSERSTATE, &prs, NULL, ret);            
  186.  
  187.                AddTextToWindow(IDC_EDIT1, "USER STATE", NULL, 0);
  188.  
  189.                sprintf(tmp, "%d", prs.CurrentState);
  190.                AddTextToWindow(IDC_EDIT1, "CurrentState", tmp, 0);
  191.                AddTextToWindow(IDC_EDIT1, "CurrentDesc", prs.CurrentDescription, 0);
  192.             }
  193.          }
  194.  
  195.          break;
  196.         }
  197.     }
  198.  
  199.     return 0;
  200. }
  201.  
  202.  
  203. char *BinToHex(char *bin, int len)
  204. {
  205.  char *buf = (char *) malloc(len * 3 + 1);
  206.  buf[0] = '\0';
  207.  char tmp[16];
  208.  
  209.  for (int i = 0; i < len; i++)
  210.  {
  211.      sprintf(tmp, "%.2X ", (unsigned char) bin[i]);
  212.      strcat(buf, tmp);
  213.  }
  214.  
  215.  return buf;
  216. }
  217.  
  218. static int TlenProtocolEvent(WPARAM wparam, LPARAM lparam)
  219. {
  220.  char tmp[128];
  221.  
  222.  ProtocolEventDef *ev = (ProtocolEventDef *) wparam;
  223.  ProtocolRawDataDef *data = (ProtocolRawDataDef *) lparam;
  224.  ProtocolMessageDef *msg = (ProtocolMessageDef *) lparam;
  225.  ProtocolPresenceDef *prs = (ProtocolPresenceDef *) lparam;
  226.  ProtocolAuthRequestDef *auth = (ProtocolAuthRequestDef *) lparam;
  227.  ContactDef *ct = (ContactDef *) lparam;
  228.  
  229.  switch (ev->EventID)
  230.  {
  231.   case PROTOCOL_EVENT_BEFORERECVRAWDATA:
  232.    AddTextToWindow(IDC_EDIT7, "BEFORERECVRAWDATA", data->Data, data->DataLength);
  233.   break;
  234.  
  235.   case PROTOCOL_EVENT_AFTERRECVRAWDATA:
  236.    AddTextToWindow(IDC_EDIT7, "AFTERRECVRAWDATA", data->Data, data->DataLength);
  237.   break;
  238.  
  239.   case PROTOCOL_EVENT_AFTERPROCESSEDRECVRAWDATA:
  240.    AddTextToWindow(IDC_EDIT7, "AFTERPROCESSEDRECVRAWDATA", data->Data, data->DataLength);
  241.   break;
  242.  
  243.   case PROTOCOL_EVENT_BEFORESENDRAWDATA:
  244.    AddTextToWindow(IDC_EDIT7, "BEFORESENDRAWDATA", data->Data, data->DataLength);
  245.   break;
  246.  
  247.   case PROTOCOL_EVENT_AFTERSENDRAWDATA:
  248.    AddTextToWindow(IDC_EDIT7, "AFTERSENDRAWDATA", data->Data, data->DataLength);
  249.   break;
  250.  
  251.   case PROTOCOL_EVENT_LOGGEDIN:
  252.    AddTextToWindow(IDC_EDIT1, "LOGGEDIN", NULL, 0);
  253.    AddTextToWindow(IDC_EDIT1, "ContactID", ct->ContactID, 0);
  254.   break;
  255.  
  256.   case PROTOCOL_EVENT_LOGGEDOUT:
  257.    AddTextToWindow(IDC_EDIT1, "LOGGEDOUT", NULL, 0);
  258.    AddTextToWindow(IDC_EDIT1, "ContactID", ct->ContactID, 0);
  259.   break;
  260.  
  261.   case PROTOCOL_EVENT_RECVROSTER:
  262.    AddTextToWindow(IDC_EDIT1, "ROSTERRECV", NULL, 0);
  263.   break;
  264.  
  265.   case PROTOCOL_EVENT_RECVMESSAGE:
  266.   case PROTOCOL_EVENT_BEFORESENDMESSAGE:
  267.   {
  268.    if (ev->EventID == PROTOCOL_EVENT_RECVMESSAGE)
  269.        AddTextToWindow(IDC_EDIT1, "MESSAGE RECV", NULL, 0);
  270.    else
  271.        AddTextToWindow(IDC_EDIT1, "BEFORE SEND MSG", NULL, 0);
  272.  
  273.    AddTextToWindow(IDC_EDIT1, "ContactID", msg->Contact.ContactID, 0);
  274.    for (int i = 0; i < msg->MultipleContacts.count; i++)
  275.        AddTextToWindow(IDC_EDIT1, "ContactIDs", msg->MultipleContacts.contacts[i].ContactID, 0);
  276.    AddTextToWindow(IDC_EDIT1, "MessageID", msg->MessageID, 0);
  277.    AddTextToWindow(IDC_EDIT1, "Text", msg->MessageText, 0);
  278.    AddTextToWindow(IDC_EDIT1, "Room", msg->RoomName, 0);
  279.    AddTextToWindow(IDC_EDIT1, "Email", msg->UserEmail, 0);
  280.    AddTextToWindow(IDC_EDIT1, "Name", msg->UserName, 0);
  281.    AddTextToWindow(IDC_EDIT1, "WWW", msg->WWWGate, 0);
  282.    sprintf(tmp, "%d", msg->MessageHandle);
  283.    AddTextToWindow(IDC_EDIT1, "MsgHandle", tmp, 0);
  284.    sprintf(tmp, "%d", msg->Flags);
  285.    AddTextToWindow(IDC_EDIT1, "MsgFlags", tmp, 0);
  286.    sprintf(tmp, "%d", msg->OwnerData);
  287.    AddTextToWindow(IDC_EDIT1, "OwnerData", tmp, 0);
  288.    sprintf(tmp, "%d", msg->TimeStamp);
  289.    AddTextToWindow(IDC_EDIT1, "TimeStamp", tmp, 0);
  290.    break;
  291.   }
  292.  
  293.   case PROTOCOL_EVENT_RECVPRESENCE:
  294.   case PROTOCOL_EVENT_BEFORESTATUSCHANGE:
  295.  
  296.    if (ev->EventID == PROTOCOL_EVENT_RECVPRESENCE)
  297.        AddTextToWindow(IDC_EDIT1, "PRESENCE RECV", NULL, 0);
  298.    else
  299.        AddTextToWindow(IDC_EDIT1, "BEFORE STATUS CHANGE", NULL, 0);
  300.  
  301.    AddTextToWindow(IDC_EDIT1, "ContactID", prs->Contact.ContactID, 0);
  302.    sprintf(tmp, "%d", prs->CurrentState);
  303.    AddTextToWindow(IDC_EDIT1, "CurrentState", tmp, 0);
  304.    AddTextToWindow(IDC_EDIT1, "CurrentDesc", prs->CurrentDescription, 0);
  305.    sprintf(tmp, "%d", prs->CurrentComeBackTimeStamp);
  306.    AddTextToWindow(IDC_EDIT1, "CurrentComeBackTimeStamp", tmp, 0);
  307.    sprintf(tmp, "%d", prs->PreviousState);
  308.    AddTextToWindow(IDC_EDIT1, "PreviousState", tmp, 0);
  309.    AddTextToWindow(IDC_EDIT1, "PreviousDesc", prs->PreviousDescription, 0);
  310.    sprintf(tmp, "%d", prs->PreviousComeBackTimeStamp);
  311.    AddTextToWindow(IDC_EDIT1, "PreviousComeBackTimeStamp", tmp, 0);
  312.    sprintf(tmp, "%d", prs->Flags);
  313.    AddTextToWindow(IDC_EDIT1, "Flags", tmp, 0);
  314.    sprintf(tmp, "%d", prs->OwnerData);
  315.    AddTextToWindow(IDC_EDIT1, "OwnerData", tmp, 0);
  316.    sprintf(tmp, "%d", prs->TimeStamp);
  317.    AddTextToWindow(IDC_EDIT1, "TimeStamp", tmp, 0);
  318.  
  319.   break;
  320.  
  321.   case PROTOCOL_EVENT_AUTHREQUEST:
  322.  
  323.    AddTextToWindow(IDC_EDIT1, "AUTH REQUEST RECV", NULL, 0);
  324.    AddTextToWindow(IDC_EDIT1, "ContactID", prs->Contact.ContactID, 0);
  325.  
  326.  break;
  327.  
  328.  }
  329.  
  330.  return 0;
  331. }
  332.  
  333. static int GGProtocolEvent(WPARAM wparam, LPARAM lparam)
  334. {
  335.  char tmp[128];
  336.  
  337.  ProtocolEventDef *ev = (ProtocolEventDef *) wparam;
  338.  ProtocolRawDataDef *data = (ProtocolRawDataDef *) lparam;
  339.  ProtocolMessageDef *msg = (ProtocolMessageDef *) lparam;
  340.  ProtocolPresenceDef *prs = (ProtocolPresenceDef *) lparam;
  341.  ContactDef *ct = (ContactDef *) lparam;
  342.  
  343.  switch (ev->EventID)
  344.  {
  345.   case PROTOCOL_EVENT_BEFORERECVRAWDATA:
  346.   {
  347.        char *dat = BinToHex(data->Data, data->DataLength);
  348.        int len = strlen(dat);
  349.        AddTextToWindow(IDC_EDIT2, "BEFORERECVRAWDATA", dat, len);
  350.        free(dat);
  351.   }
  352.   break;
  353.  
  354.   case PROTOCOL_EVENT_AFTERRECVRAWDATA:
  355.   {
  356.       char *dat = BinToHex(data->Data, data->DataLength);
  357.       int len = strlen(dat);
  358.       AddTextToWindow(IDC_EDIT2, "AFTERRECVRAWDATA", dat, len);
  359.       free(dat);
  360.   }
  361.   break;
  362.  
  363.   case PROTOCOL_EVENT_AFTERPROCESSEDRECVRAWDATA:
  364.   {
  365.       char *dat = BinToHex(data->Data, data->DataLength);
  366.       int len = strlen(dat);
  367.       AddTextToWindow(IDC_EDIT2, "AFTERPROCESSEDRECVRAWDATA", dat, len);
  368.       free(dat);
  369.   }
  370.   break;
  371.  
  372.   case PROTOCOL_EVENT_BEFORESENDRAWDATA:
  373.   {
  374.       char *dat = BinToHex(data->Data, data->DataLength);
  375.       int len = strlen(dat);
  376.       AddTextToWindow(IDC_EDIT2, "BEFORESENDRAWDATA", dat, len);
  377.       free(dat);
  378.   }
  379.   break;
  380.  
  381.   case PROTOCOL_EVENT_AFTERSENDRAWDATA:
  382.   {
  383.       char *dat = BinToHex(data->Data, data->DataLength);
  384.       int len = strlen(dat);
  385.       AddTextToWindow(IDC_EDIT2, "AFTERSENDRAWDATA", dat, len);
  386.       free(dat);
  387.   }
  388.   break;
  389.  
  390.   case PROTOCOL_EVENT_LOGGEDIN:
  391.    AddTextToWindow(IDC_EDIT8, "LOGGEDIN", NULL, 0);
  392.    AddTextToWindow(IDC_EDIT8, "ContactID", ct->ContactID, 0);
  393.   break;
  394.  
  395.   case PROTOCOL_EVENT_LOGGEDOUT:
  396.    AddTextToWindow(IDC_EDIT8, "LOGGEDOUT", NULL, 0);
  397.    AddTextToWindow(IDC_EDIT8, "ContactID", ct->ContactID, 0);
  398.   break;
  399.  
  400.   case PROTOCOL_EVENT_RECVMESSAGE:
  401.   case PROTOCOL_EVENT_BEFORESENDMESSAGE:
  402.   {
  403.    if (ev->EventID == PROTOCOL_EVENT_RECVMESSAGE)
  404.        AddTextToWindow(IDC_EDIT8, "MESSAGE RECV", NULL, 0);
  405.    else
  406.        AddTextToWindow(IDC_EDIT8, "BEFORE SEND MSG", NULL, 0);
  407.  
  408.    AddTextToWindow(IDC_EDIT8, "ContactID", msg->Contact.ContactID, 0);
  409.    for (int i = 0; i < msg->MultipleContacts.count; i++)
  410.        AddTextToWindow(IDC_EDIT8, "ContactIDs", msg->MultipleContacts.contacts[i].ContactID, 0);
  411.    AddTextToWindow(IDC_EDIT8, "MessageID", msg->MessageID, 0);
  412.    AddTextToWindow(IDC_EDIT8, "Text", msg->MessageText, 0);
  413.    AddTextToWindow(IDC_EDIT8, "Room", msg->RoomName, 0);
  414.    AddTextToWindow(IDC_EDIT8, "Email", msg->UserEmail, 0);
  415.    AddTextToWindow(IDC_EDIT8, "Name", msg->UserName, 0);
  416.    AddTextToWindow(IDC_EDIT8, "WWW", msg->WWWGate, 0);
  417.    sprintf(tmp, "%d", msg->MessageHandle);
  418.    AddTextToWindow(IDC_EDIT8, "MsgHandle", tmp, 0);
  419.    sprintf(tmp, "%d", msg->Flags);
  420.    AddTextToWindow(IDC_EDIT8, "MsgFlags", tmp, 0);
  421.    sprintf(tmp, "%d", msg->OwnerData);
  422.    AddTextToWindow(IDC_EDIT8, "OwnerData", tmp, 0);
  423.    sprintf(tmp, "%d", msg->TimeStamp);
  424.    AddTextToWindow(IDC_EDIT8, "TimeStamp", tmp, 0);
  425.    break;
  426.   }
  427.  
  428.   case PROTOCOL_EVENT_RECVPRESENCE:
  429.   case PROTOCOL_EVENT_BEFORESTATUSCHANGE:
  430.  
  431.    if (ev->EventID == PROTOCOL_EVENT_RECVPRESENCE)
  432.        AddTextToWindow(IDC_EDIT8, "PRESENCE RECV", NULL, 0);
  433.    else
  434.        AddTextToWindow(IDC_EDIT8, "BEFORE STATUS CHANGE", NULL, 0);
  435.  
  436.    AddTextToWindow(IDC_EDIT8, "ContactID", prs->Contact.ContactID, 0);
  437.    sprintf(tmp, "%d", prs->CurrentState);
  438.    AddTextToWindow(IDC_EDIT8, "CurrentState", tmp, 0);
  439.    AddTextToWindow(IDC_EDIT8, "CurrentDesc", prs->CurrentDescription, 0);
  440.    sprintf(tmp, "%d", prs->CurrentComeBackTimeStamp);
  441.    AddTextToWindow(IDC_EDIT8, "CurrentComeBackTimeStamp", tmp, 0);
  442.    sprintf(tmp, "%d", prs->PreviousState);
  443.    AddTextToWindow(IDC_EDIT8, "PreviousState", tmp, 0);
  444.    AddTextToWindow(IDC_EDIT8, "PreviousDesc", prs->PreviousDescription, 0);
  445.    sprintf(tmp, "%d", prs->PreviousComeBackTimeStamp);
  446.    AddTextToWindow(IDC_EDIT8, "PreviousComeBackTimeStamp", tmp, 0);
  447.    sprintf(tmp, "%d", prs->Flags);
  448.    AddTextToWindow(IDC_EDIT8, "Flags", tmp, 0);
  449.    sprintf(tmp, "%d", prs->OwnerData);
  450.    AddTextToWindow(IDC_EDIT8, "OwnerData", tmp, 0);
  451.    sprintf(tmp, "%d", prs->TimeStamp);
  452.    AddTextToWindow(IDC_EDIT8, "TimeStamp", tmp, 0);
  453.  
  454.   break;
  455.  }
  456.  
  457.  return 0;
  458. }
  459.  
  460. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
  461. {
  462.     hInst=hinstDLL;
  463.     return TRUE;
  464. }
  465.  
  466. __declspec(dllexport) TLENPLUGININFO* GetPluginInfo(DWORD tlenVersion)
  467. {
  468.     return &pluginInfo;
  469. }
  470.  
  471. __declspec(dllexport) int LoadPlugin(TLENPLUGINFUNCTIONS *functions)
  472. {
  473.     tlen_functions = functions;
  474.  
  475.     window = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) WindowProc);
  476.  
  477.         ProtocolHookDef th;
  478.         InitializeStruct(th);
  479.         th.ProtocolID = PROTOCOL_ID_TLEN;
  480.         th.CallBackFunc = TlenProtocolEvent;
  481.         th.moduleHandle = hInst;
  482.  
  483.         tlen_hook = (HANDLE) tlen_functions->CallTlenFunction(hInst, TLEN_PROTOCOL_HOOK_EVENT, (WPARAM) &th, NULL);
  484.  
  485.         th.ProtocolID = PROTOCOL_ID_GG;
  486.         th.CallBackFunc = GGProtocolEvent;
  487.         gg_hook = (HANDLE) tlen_functions->CallTlenFunction(hInst, TLEN_PROTOCOL_HOOK_EVENT, (WPARAM) &th, NULL);
  488.     
  489.     return 0;
  490. }
  491.  
  492. __declspec(dllexport) int UnloadPlugin(void)
  493. {
  494.     tlen_functions->CallTlenFunction(hInst, TLEN_PROTOCOL_UNHOOK_EVENT, (WPARAM) PROTOCOL_ID_TLEN, (LPARAM) tlen_hook);
  495.     tlen_functions->CallTlenFunction(hInst, TLEN_PROTOCOL_UNHOOK_EVENT, (WPARAM) PROTOCOL_ID_GG, (LPARAM) gg_hook);
  496.     if (window) DestroyWindow(window);
  497.     return 0;
  498. }
  499.